package com.nui.multiphotopicker;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import xf.tools.Other;
import xf.tools.ToolPicture;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.Parameters;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.format.DateFormat;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.emm.yixun.mobile.R;
import com.emm.yixun.mobile.base.BaseActivity;

@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
public class Personal_information_photography_Acitvity extends BaseActivity {

	int cameraCount = 0;
	Camera cam;
	private SurfaceHolder holder;
	private Camera camera;// 声明相机
	private String filepath = "";// 照片保存路径
	private int cameraPosition = 1;// 0代表前置摄像头，1代表后置摄像头
	private File dir = Environment.getExternalStorageDirectory();
	private String path;
	private String image_name;

	private LinearLayout light_open;

	private TextView back_phone;

	private SurfaceView surface;

	private Button photograph;
	private Button mode_conversion;
	private boolean isOpen = true;
	private File picture;
	private Camera.Parameters parameters;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);

		this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 拍照过程屏幕一直处于高亮

		// 设置手机屏幕朝向，一共有7种
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		BaseActivity.activity = this;
		// SCREEN_ORIENTATION_BEHIND： 继承Activity堆栈中当前Activity下面的那个Activity的方向
		// SCREEN_ORIENTATION_LANDSCAPE： 横屏(风景照) ，显示时宽度大于高度
		// SCREEN_ORIENTATION_PORTRAIT： 竖屏 (肖像照) ， 显示时高度大于宽度
		// SCREEN_ORIENTATION_SENSOR
		// 由重力感应器来决定屏幕的朝向,它取决于用户如何持有设备,当设备被旋转时方向会随之在横屏与竖屏之间变化
		// SCREEN_ORIENTATION_NOSENSOR：
		// 忽略物理感应器——即显示方向与物理感应器无关，不管用户如何旋转设备显示方向都不会随着改变("unspecified"设置除外)
		// SCREEN_ORIENTATION_UNSPECIFIED：
		// 未指定，此为默认值，由Android系统自己选择适当的方向，选择策略视具体设备的配置情况而定，因此不同的设备会有不同的方向选择
		// SCREEN_ORIENTATION_USER： 用户当前的首选方向

		setContentView(R.layout.personal_information_photography_acitvity);

		mode_conversion = (Button) findViewById(R.id.mode_conversion);
		photograph = (Button) findViewById(R.id.photograph);
		surface = (SurfaceView) findViewById(R.id.camera_surface);
		back_phone = (TextView) findViewById(R.id.back_phone);
		light_open = (LinearLayout) findViewById(R.id.light_open);

		back_phone.setOnClickListener(listener);
		mode_conversion.setOnClickListener(listener);
		photograph.setOnClickListener(listener);
		light_open.setOnClickListener(listener);

		holder = surface.getHolder();// 获得句柄
		holder.addCallback(surfaceCallback);// 添加回调
		holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// surfaceview不维护自己的缓冲区，等待屏幕渲染引擎将内容推送到用户面前

		Date date = new Date(System.currentTimeMillis());
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmssEEEE");
		image_name = dateFormat.format(date) + ".jpg";
		path = dir.getPath() + "/DCIM/Camera";
		File destDir = new File(path);
		if (!destDir.exists()) {
			destDir.mkdir();
		}

	}

	@Override
	protected void onResume() {
		BaseActivity.activity = this;
		IntentFilter filter = new IntentFilter(Other.VGOPLAY_1);
		registerReceiver(mBroadcastReceiver, filter);
		super.onResume();
	}

	private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (action.equals(Other.VGOPLAY_1)) {
				finish();
			}
		}
	};

	protected void onDestroy() {
		unregisterReceiver(mBroadcastReceiver);
		super.onDestroy();
	};

	// 响应点击事件
	@SuppressLint("NewApi")
	OnClickListener listener = new OnClickListener() {
		@TargetApi(Build.VERSION_CODES.GINGERBREAD)
		@SuppressLint("NewApi")
		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			switch (v.getId()) {
			case R.id.back_phone:
				// 返回
				finish();
				break;

			case R.id.mode_conversion:
				// 切换前后摄像头
				int cameraCount = 0;
				CameraInfo cameraInfo = new CameraInfo();
				cameraCount = Camera.getNumberOfCameras();// 得到摄像头的个数

				for (int i = 0; i < cameraCount; i++) {
					Camera.getCameraInfo(i, cameraInfo);// 得到每一个摄像头的信息
					if (cameraPosition == 1) {
						// 现在是后置，变更为前置
						if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//
							// 代表摄像头的方位，CAMERA_FACING_FRONT前置
							// CAMERA_FACING_BACK后置
							camera.stopPreview();// 停掉原来摄像头的预览
							camera.release();// 释放资源
							camera = null;// 取消原来摄像头
							camera = Camera.open(i);// 打开当前选中的摄像头
							try {
								camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							camera.startPreview();// 开始预览
							cameraPosition = 0;
							camera.setDisplayOrientation(90);
							mode_conversion.setBackgroundResource(R.drawable.bg_img);
							// Toast.makeText(CameraActivity.this, "前置摄像头", 0)
							// .show();
							break;
						}
					} else {
						// 现在是前置， 变更为后置
						if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//
							// 代表摄像头的方位，CAMERA_FACING_FRONT前置
							// CAMERA_FACING_BACK后置
							camera.stopPreview();// 停掉原来摄像头的预览
							camera.release();// 释放资源
							camera = null;// 取消原来摄像头
							camera = Camera.open(i);// 打开当前选中的摄像头
							try {
								camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							camera.startPreview();// 开始预览
							cameraPosition = 1;
							camera.setDisplayOrientation(90);
							mode_conversion.setBackgroundResource(R.drawable.ic_launcher);

							break;
						}
					}

				}
				break;

			case R.id.photograph:
				// 快门
				// camera.autoFocus(new AutoFocusCallback() {// 自动对焦
				// @Override
				// public void onAutoFocus(boolean success, Camera camera) {
				// // TODO Auto-generated method stub
				// if (success) {
				// // 设置参数，并拍照
				// Parameters params = camera.getParameters();
				// params.setPictureFormat(PixelFormat.JPEG);// 图片格式
				// params.setPreviewSize(800, 480);// 图片大小
				// params.setRotation(getPreviewDegree(Personal_information_photography_Acitvity.this));
				// camera.setParameters(params);// 将参数设置到我的camera
				// camera.takePicture(null, null, jpeg);// 将拍摄到的照片给自定义的对象
				// }
				// }
				// });

				takePic();

				break;

			case R.id.light_open:

				if (isOpen == true) {
					parameters = camera.getParameters();
					parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);// 开启
					camera.setParameters(parameters);
					isOpen = false;
				} else if (isOpen == false) {
					isOpen = true;
					parameters = camera.getParameters();
					parameters.setFlashMode(Parameters.FLASH_MODE_OFF);// 关闭
					camera.setParameters(parameters);

				}

				break;
			}
		}
	};

	private void takePic() {
		// TODO stop the preview if remove comment block will system error
		// camera.stopPreview();
		camera.takePicture(null, null, pictureCallback);
	}

	/**
	 * SurfaceHodler回调： 打开照相机、关闭照相机、设置照片尺寸等操作
	 */
	@SuppressLint("NewApi")
	SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {

		public void surfaceCreated(SurfaceHolder holder) {

			try {
				camera = Camera.open();
				camera.setPreviewDisplay(holder);
			} catch (Exception e) {
				camera.release();
				camera = null;

			}
		}

		@SuppressLint("NewApi")
		public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

			// 照相机参数
			parameters = camera.getParameters();
			parameters.setPictureFormat(PixelFormat.JPEG);
			parameters.set("rotation", 90);
			// TODO 三星PAD设置预览大小不正确会崩溃
			// parameters.setPreviewSize(500, 500);
			// parameters.setPictureSize(200, 200);
			camera.setParameters(parameters);
			camera.setDisplayOrientation(90);
			camera.startPreview();
		}

		public void surfaceDestroyed(SurfaceHolder holder) {

			camera.stopPreview();
			camera.release();
			camera = null;
		}
	};

	/**
	 * 图片回调函数
	 */
	Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
		@Override
		public void onPictureTaken(byte[] data, Camera camera) {

			// 等待提示

			new SavePictureTask().execute(data);
			camera.startPreview();
		}
	};

	/**
	 * 保存图片异步任务
	 */
	protected class SavePictureTask extends AsyncTask<byte[], String, String> {

		/**
		 * 运行在UI线程中，在调用doInBackground()之前执行
		 */
		@Override
		protected void onPreExecute() {
			// getOperation().updateLoadingText("正在保存...");
		}

		@Override
		protected String doInBackground(byte[]... params) {

			String fname = DateFormat.format("yyyyMMddhhmmss", new Date()).toString() + ".jpg";
			picture = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera/" + fname);

			// 判断文件夹是否存在
			File file = picture.getParentFile();
			if (!file.exists())
				file.mkdir();

			try {
				FileOutputStream fos = new FileOutputStream(picture.getPath());
				fos.write(params[0]);
				fos.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
			return null;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);

			if (isOpen == false) {
				parameters = camera.getParameters();
				parameters.setFlashMode(Parameters.FLASH_MODE_OFF);// 关闭
				camera.setParameters(parameters);
			}
			// Bundle bundle = new Bundle();
			// bundle.putString("name", picture.getPath());
			Intent intent = new Intent(Personal_information_photography_Acitvity.this, Use_photos_Activity.class);
			intent.putExtra("name", picture.getPath());
			startActivity(intent);
			// showActivity(Personal_information_photography_Acitvity.this,
			// Use_photos_Activity.class, bundle);
		}

	}

	/**
	 * 矫正旋转角度后的图像
	 * 
	 * @param filePath
	 *            图片文件
	 * @return 矫正角度后的图像
	 */
	private Bitmap getDiskBitmap(String filePath) {
		Bitmap bitmap = null;
		try {
			File file = new File(filePath);
			if (file.exists())
				bitmap = BitmapFactory.decodeFile(filePath);

			// 获取图片的旋转角度，有些系统把拍照的图片旋转了，有的没有旋转
			int degree = ToolPicture.gainPictureDegree(filePath);
			if (degree != 0)
				bitmap = ToolPicture.rotaingBitmap(degree, bitmap);

		} catch (Exception e) {
			// Log.e(TAG, e.getMessage());
		}

		return bitmap;
	}

	/*
	 * surfaceHolder他是系统提供的一个用来设置surfaceView的一个对象，而它通过surfaceView.getHolder()这个方法来获得
	 * 。 Camera提供一个setPreviewDisplay(SurfaceHolder)的方法来连接
	 */

	// SurfaceHolder.Callback,这是个holder用来显示surfaceView 数据的接口,他必须实现以下3个方法
	// @Override
	// public void surfaceChanged(SurfaceHolder holder, int format, int width,
	// int height) {
	// // TODO Auto-generated method stub
	// // surface大小改变时激发
	//
	// camera.setDisplayOrientation(getPreviewDegree(Personal_information_photography_Acitvity.this));
	// }

	// // 提供一个静态方法，用于根据手机方向获得相机预览画面旋转的角度
	// public static int getPreviewDegree(Activity activity) {
	// // 获得手机的方向
	// int rotation = activity.getWindowManager().getDefaultDisplay()
	// .getRotation();
	// int degree = 0;
	// // 根据手机的方向计算相机预览画面应该选择的角度
	// switch (rotation) {
	// case Surface.ROTATION_0:
	// degree = 90;
	// break;
	// case Surface.ROTATION_90:
	// degree = 0;
	// break;
	// case Surface.ROTATION_180:
	// degree = 270;
	// break;
	// case Surface.ROTATION_270:
	// degree = 180;
	// break;
	// }
	// return degree;
	// }
	//
	// // 创建激发，一般在这里调用画图的线程
	// @Override
	// public void surfaceCreated(SurfaceHolder holder) {
	// // TODO Auto-generated method stub
	// // 当surfaceview创建时开启相机
	// if (camera == null) {
	// camera = Camera.open();
	// try {
	// camera.setPreviewDisplay(holder);// 通过surfaceview显示取景画面
	// camera.startPreview();// 开始预览
	// } catch (IOException e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// }

	// // 销毁激发，一般在这里将画图的线程停止，释放
	// @Override
	// public void surfaceDestroyed(SurfaceHolder holder) {
	// // TODO Auto-generated method stub
	// // 当surfaceview关闭时，关闭预览并释放资源
	// camera.stopPreview();
	// camera.release();
	// camera = null;
	// holder = null;
	// surface = null;
	// }
	//
	// // 创建jpeg图片回调数据对象
	// PictureCallback jpeg = new PictureCallback() {
	// @Override
	// public void onPictureTaken(byte[] data, Camera camera) {
	// // TODO Auto-generated method stub
	// try {
	// Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
	// data.length);
	// // 自定义文件保存路径 以拍摄时间区分命名
	// filepath = path + "/" + image_name;
	// File file = new File(filepath);
	// BufferedOutputStream bos = new BufferedOutputStream(
	// new FileOutputStream(file));
	// bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);// 将图片压缩的流里面
	// bos.flush();// 刷新此缓冲区的输出流
	// bos.close();// 关闭此输出流并释放与此流有关的所有系统资源
	// camera.stopPreview();// 关闭预览 处理数据
	// camera.startPreview();// 数据处理完后继续开始预览
	// bitmap.recycle();// 回收bitmap空间
	//
	// Bundle bundle = new Bundle();
	// bundle.putString("name", filepath);
	// showActivity(Personal_information_photography_Acitvity.this,
	// Use_photos_Activity.class, bundle);
	//
	// } catch (Exception e) {
	// // TODO Auto-generated catch block
	// e.printStackTrace();
	// }
	// }
	// };
}
